/**
 * 提供复用逻辑的函数(钩子)
 */

import { useIntersectionObserver, useIntervalFn } from '@vueuse/core'
import { onUnmounted, ref } from 'vue'
import dayjs from 'dayjs'

/**
 * 数据懒加载函数
 * @param apiFn  API函数
 */
export const useLazyData = (apiFn) => {
  // DOM对象
  const target = ref(null)
  const result = ref([])
  // stop 是停止观察是否进入或移出可视区区域的行为
  const { stop } = useIntersectionObserver(
    // target 是监听的目标dom元素, 必须是dom容器, 而且是vue3.0方式绑定的dom对象
    target,
    // isIntersecting 是否进入可视区, true是进入, false是移出
    // observerElement 被观察的dom
    ([{ isIntersecting }, observerElement]) => {
      if (isIntersecting) {
        debugger
        stop()
        // 调用API函数获取数据
        apiFn().then((res) => {
          result.value = res.result
        })
      }
    },
    // 配置选项, 相交的比例大于0就触发懒加载, 请求API
    // 处理板块需要进入可视区太多内容才能加载数据问题
    {
      threshold: 0
    })

  return {
    target,
    result
  }
}

/**
 * 支付倒计时函数
 */
export const usePayTime = () => {
  // 倒计时
  const time = ref(0)
  // 倒计时显示的文字
  const countdownText = ref('')

  // 倒计时逻辑
  const {
    pause,      // 暂停
    resume      // 开启
  } = useIntervalFn(() => {
    time.value--
    // 转换时间设置给countdownText
    countdownText.value = dayjs.unix(time.value).format('mm分ss秒')
    if (time.value <= 0) {
      // 清除定时器 类始于 window.clearInterval
      pause()
    }
  }, 1000, false)

  // bug点, 组件销毁时的声明周期函数写成了 onMounted
  // 组件销毁时, 需要清除定时器
  onUnmounted(() => {
    pause()
  })

  /**
   * 开启定时器
   * @param countdown 倒计时秒数
   */
  const start = (countdown) => {
    time.value = countdown
    // 开启定时器的时候, 就把时间转换一下, 这样显示剩余时间区域就不会有一个空白
    countdownText.value = dayjs.unix(time.value).format('mm分ss秒')
    resume()
  }

  return {
    pause,
    time,
    start,
    countdownText
  }
}
